home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok42
/
menu
/
menudemo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
8KB
|
282 lines
(*******************************************************************************
:Program. MenuDemo.mod
:Author. Jan Behrens
:Address. Hauptstraße 13, 2211 Holstenniendorf
:Copyright. PD, siehe Menu.dok
:Language. Modula-2
:Translator. M2Amiga
:History. V1.0 8.Aug.90, Hoffentlich nur wenige Fehler !
:Contents. Es werden die Fonts in einen Menu dargestellt
*******************************************************************************)
MODULE MenuDemo;
FROM DiskFont IMPORT AvailFonts,AvailFontTypes,AvailFontTypeSet,AvailFont,
OpenDiskFont;
FROM SYSTEM IMPORT ADDRESS,ADR,LONGSET;
FROM Exec IMPORT AllocMem,FreeMem,MemReqs,MemReqSet;
FROM Arts IMPORT TermProcedure,Assert;
FROM Intuition IMPORT IntuiText,PrintIText,NewWindow,WindowPtr,OpenWindow,
CloseWindow,IDCMPFlags,IDCMPFlagSet,WindowFlags,
WindowFlagSet,ScreenFlags,ScreenFlagSet,
IntuiTextLength;
FROM Dos IMPORT Delay;
FROM Graphics IMPORT jam1,TextAttr,TextFontPtr,RemFont,CloseFont,DrawModes,
DrawModeSet;
FROM Menu IMPORT MenuFlags,MenuFlagSet,MenuType,Menu,DrawMenu;
FROM MouseButtons IMPORT leftMouseButton;
CONST NumFonts=100; (*Maximale Anzahl der Fonts, die gefunden
werden können*)
TYPE AvailFontHeader=RECORD (*Record dessen Zeiger von AvailFonts*)
numEntries:CARDINAL; (*zurückgegeben wird*)
af:ARRAY[0..NumFonts-1] OF AvailFont;
END (*RECORD*);
AvailFontHeaderPtr=POINTER TO AvailFontHeader;
VAR win:NewWindow;
WPtr:WindowPtr;
status:LONGINT;
availPtr:AvailFontHeaderPtr;
i,selectedFont,CheckSelect,count,NumItems,y:CARDINAL;
x:INTEGER;
textFonts:ARRAY[0..NumFonts-1] OF TextFontPtr;
intuiText:ARRAY[0..NumFonts-1] OF IntuiText;
CheckText:ARRAY[0..3]OF IntuiText;
goonText,HailText,CheckHail:IntuiText;
menu,CheckMenu:Menu; (*Menu-Definition*)
oneMenu:BOOLEAN;
string:ARRAY[0..1]OF CHAR;
CheckiTexte:ARRAY[0..3],[0..10] OF CHAR;
DModes:DrawModeSet;
PROCEDURE CleanUp();
BEGIN
FOR i:=0 TO availPtr^.numEntries-1 DO
IF textFonts[i]#NIL THEN
CloseFont(textFonts[i]);
END;
IF textFonts[i]#NIL THEN
RemFont(textFonts[i]);
END;
END;
IF availPtr#NIL THEN FreeMem(availPtr,SIZE(AvailFontHeader)) END;
IF WPtr#NIL THEN CloseWindow(WPtr) END;
END CleanUp;
BEGIN
TermProcedure(CleanUp);
(*--Create window--*)
WITH win DO
leftEdge:=0;
topEdge:=0;
width:=640;
height:=256;
detailPen:=1;
blockPen:=0;
idcmpFlags:=IDCMPFlagSet{mouseButtons,rawKey,mouseMove};
flags:=WindowFlagSet{activate,reportMouse,windowSizing,windowDrag};
firstGadget:=NIL;
checkMark:=NIL;
title:=ADR(" MenuDemo © August`90 Jan Behrens");
screen:=NIL;
bitMap:=NIL;
minWidth:=50;
minHeight:=50;
maxWidth:=640;
maxHeight:=256;
type:=ScreenFlagSet{wbenchScreen};
END (*WITH*);
WPtr:=OpenWindow(win);
Assert(WPtr#NIL,ADR("Can`t open window..."));
(*--Hole verfügbare Fonts--*)
availPtr:=AllocMem(SIZE(AvailFontHeader),MemReqSet{memClear});
Assert(availPtr#NIL,ADR("No Memory..."));
status:=AvailFonts(availPtr,SIZE(AvailFontHeader),
AvailFontTypeSet{memory,disk});(*Suche Fonts*);
Assert(status=0,ADR("Speicher war zu klein..."));
(*--Open fonts--*)
FOR i:=0 TO availPtr^.numEntries-1 DO
IF NOT(memory IN availPtr^.af[i].type) THEN
textFonts[i]:=OpenDiskFont(ADR(availPtr^.af[i].attr));
END;
END (*FOR*);
WITH CheckHail DO (*IntuiTexte für Menus mit Daten*)
frontPen:=2; (*füllen*)
backPen:=0;
drawMode:=DrawModeSet{inversvid};
leftEdge:=5;
topEdge:=3;
iText:=ADR("Welche DrawModes ?");
iTextFont:=NIL;
nextText:=NIL;
END (*WITH*);
FOR i:=0 TO 3 DO
WITH CheckText[i] DO
frontPen:=1;
backPen:=0;
drawMode:=jam1;
leftEdge:=5;
topEdge:=16+i*13;
iText:=ADR(CheckiTexte[i]);
iTextFont:=NIL;
IF i#3 THEN
nextText:=ADR(CheckText[i+1]);
ELSE
nextText:=NIL;
END (*IF*);
END (*WITH*);
END (*FOR*);
CheckiTexte[0]:="dm0";
CheckiTexte[1]:="complement";
CheckiTexte[2]:="inversvid";
CheckiTexte[3]:="---ENDE---";
WITH CheckMenu DO (*Ein Check-Menu mit Daten füllen*)
leftEdge:=243;
topEdge:=94;
width:=154;
height:=68;
type:=checkMenu;
flags:=MenuFlagSet{borderItems,menuBorder,standardWidth};
numItems:=4;
selectedItems:=LONGSET{};
checkMark:=NIL;
standWidth:=82;
hailText:=ADR(CheckHail);
firstText:=ADR(CheckText[0]);
END;
WITH goonText DO
frontPen:=2;
backPen:=0;
drawMode:=jam1;
leftEdge:=5;
iTextFont:=NIL;
nextText:=NIL;
END (*WITH*);
WITH HailText DO
frontPen:=2;
backPen:=0;
drawMode:=DrawModeSet{inversvid};
leftEdge:=5;
topEdge:=3;
iText:=ADR("Such dir einen Font aus :");
iTextFont:=NIL;
nextText:=NIL;
END (*WITH*);
oneMenu:=TRUE;
LOOP
y:=16;
count:=0;
x:=IntuiTextLength(ADR(HailText));
FOR i:=0 TO availPtr^.numEntries DO
IF (y+availPtr^.af[i].attr.ySize+13<236) AND (i#availPtr^.numEntries) THEN
WITH intuiText[count] DO
frontPen:=1;
backPen:=0;
drawMode:=jam1;
leftEdge:=5;
topEdge:=y;
iTextFont:=ADR(availPtr^.af[i].attr);
iText:=availPtr^.af[i].attr.name;
nextText:=ADR(intuiText[count+1]);
END;
IF (IntuiTextLength(ADR(intuiText[count])) > x) THEN
x:=IntuiTextLength(ADR(intuiText[count]));
END (*IF*);
y:=y+3+availPtr^.af[i].attr.ySize;
INC(count);
ELSE
goonText.topEdge:=y;
IF (i=availPtr^.numEntries) THEN
IF oneMenu THEN
intuiText[count-1].nextText:=NIL;
NumItems:=count;
ELSE
intuiText[count-1].nextText:=ADR(goonText);
goonText.iText:=ADR("Erste Fonts noch einmal");
NumItems:=count+1;
IF x<184 THEN
x:=184;
END;
y:=y+13;
END (*IF*);
ELSE
intuiText[count-1].nextText:=ADR(goonText);
goonText.iText:=ADR("Weitere Fonts");
NumItems:=count+1;
IF x<104 THEN
x:=104;
END;
y:=y+13;
END (*IF*);
WITH menu DO
leftEdge:=(640-x) DIV 2;
topEdge:=(256-y) DIV 2;
width:=x+10;
height:=y;
type:=selectMenu;
flags:=MenuFlagSet{invertItems,menuBorder};
numItems:=NumItems;
selectedItems:=LONGSET{};
checkMark:=NIL;
standWidth:=0;
hailText:=ADR(HailText);
firstText:=ADR(intuiText[0]);
END;
selectedFont:=DrawMenu(WPtr,ADR(menu));
Delay(5);
IF selectedFont#count THEN
EXIT
ELSE
y:=16;
count:=0;
oneMenu:=FALSE;
x:=IntuiTextLength(ADR(HailText));
END (*IF*);
END (*IF*);
END (*FOR*);
END (*LOOP*);
CheckSelect:=DrawMenu(WPtr,ADR(CheckMenu));
FOR i:=1 TO 3 DO
IF i IN CheckMenu.selectedItems THEN
INCL(DModes,VAL(DrawModes,i));
END (*IF*);
END (*FOR*);
(*--DoAction--*)
y:=10;
x:=0;
string[1]:=0C;
intuiText[selectedFont].iText:=ADR(string);
intuiText[selectedFont].drawMode:=DModes;
intuiText[selectedFont].nextText:=NIL;
intuiText[selectedFont].topEdge:=0;
intuiText[selectedFont].leftEdge:=0;
LOOP
FOR i:=32 TO 255 DO
IF x>640 THEN
INC(y,intuiText[selectedFont].iTextFont^.ySize);
x:=0;
END (*IF*);
IF y>256 THEN
EXIT
END;
string[0]:=CHR(i);
PrintIText(WPtr^.rPort,ADR(intuiText[selectedFont]),x,y);
INC(x,IntuiTextLength(ADR(intuiText[selectedFont])));
END (*FOR*);
END (*LOOP*);
REPEAT UNTIL leftMouseButton();
END MenuDemo.